package org.ykh.srb.core.service.impl;

import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.ExcelWriter;
import com.alibaba.excel.write.metadata.WriteSheet;
import org.springframework.beans.factory.annotation.Lookup;
import org.ykh.srb.core.pojo.dto.ExcelDictDTO;
import org.ykh.srb.core.pojo.entity.DictEntity;
import org.ykh.srb.core.listener.ExcelDictDTOListener;
import org.ykh.srb.core.mapper.DictMapper;
import org.ykh.srb.core.service.DictService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.stereotype.Service;

import java.io.InputStream;
import java.io.OutputStream;
import java.util.List;

/**
 * <p>
 * 数据字典 服务实现类
 * </p>
 *
 * @author ykh
 * @since 2024-03-12
 */
@Service
public abstract class DictServiceImpl extends ServiceImpl<DictMapper, DictEntity> implements DictService {

    @Override
    public void importData(InputStream inputStream) {
        //默认读取excel的第一个sheet
        EasyExcel.read(inputStream,ExcelDictDTO.class,createExcelDictListener()).sheet().doRead();
    }

    @Override
    public void exportData(OutputStream outputStream) {
//        EasyExcel.write(response.getOutputStream(), ExcelDictDTO.class).sheet("数据字典").doWrite(baseMapper.selectListExcelDictDto());
        try (ExcelWriter excelWriter = EasyExcel.write(outputStream, ExcelDictDTO.class).build()) {
            // 这里注意 如果同一个sheet只要创建一次
            WriteSheet writeSheet = EasyExcel.writerSheet("数据字典").build();
            // 去调用写入,这里我调用了五次，实际使用时根据数据库分页的总的页数来
//            for (int i = 0; i < 5; i++) {
                // 分页去数据库查询数据 这里可以去数据库查询每一页的数据
                //由于每次查询后的数据都会创建新的对象，对象只是作为数据容器，然而gc不是立刻发生的导致大量内存被浪费，且gc时会导致整个系统停顿。
                //所以可以让mybatis的对象工厂使用使用对象池，减少内存的浪费。
                final List<ExcelDictDTO> excelDictDTOS = baseMapper.selectListExcelDictDto();
                excelWriter.write(excelDictDTOS, writeSheet);
//            }
        }
    }

    /**
     * 单例依赖多例，采用方法注入，@Lookup表示cglib生成代理实现该方法从容器种获取返回类型
     * @return
     */
    @Lookup
    public abstract ExcelDictDTOListener createExcelDictListener();


}
